package com.zut.controller;
import com.google.gson.Gson;
import com.wechat.pay.contrib.apache.httpclient.auth.Verifier;
import com.zut.service.WxPayService;
import com.zut.util.HttpUtils;
import com.zut.util.WechatPay2ValidatorForRequest;
import com.zut.vo.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * 微信支付Controller
 */
@CrossOrigin
@RestController
@Slf4j
@RequestMapping("/api/wx-pay")
@Api(tags = "微信支付接口")
public class WxPayController {

    @Autowired
    private WxPayService wxPayService;

    @Autowired
    private Verifier validator;  // 注入验签的校验器



    // 发起支付
    @ApiOperation("发起支付,生成一个支付的二维码")
    @PostMapping("/native/{productId}")
    public R nativePay(@PathVariable("productId") Long productId) throws Exception {
        log.info("发起支付,生成一个支付的二维码");

        // 调用支付，最终会返回一个map类型的数据
        Map<String,Object> map = null;
        try{
            map = wxPayService.nativePay(productId);
        }catch (Exception e){
            e.printStackTrace();
        }
        return R.ok().setData(map);
    }

    // 接收微信的异步通知  回调函数 微信要把这个支付结果来通知给我们
    // 回调地址
    // https://5312-182-119-255-237.ngrok-free.app/api/wx-pay/native/notify
    // HttpServletRequest request  这里面封装了微信给我们的请求
    // HttpServletResponse response  这里面封装了微信给我们的响应
    // 我们解析微信的通知，同时给微信一个接收成功的通知
    @ApiOperation("接收微信支付的通知")
    @PostMapping("/native/notify")
    public String nativeNotify(HttpServletRequest request, HttpServletResponse response) throws Exception{
        log.info("接收微信支付的通知");

//        log.info("进行休眠测试，测试微信接收不到商户响应时，每搁几秒发送一次请求");
//        Thread.currentThread().sleep(10000);
        Gson gson = new Gson();
        Map<String, Object> map = new HashMap<>();
        try {
            // 使用工具类将微信发送过来的请求参数转换成字符串
            String body = HttpUtils.readData(request);

            // 微信的响应（request-->body） 转换成 map 类型
            HashMap<String,Object> bodyMap = gson.fromJson(body, HashMap.class);
            // 取出请求体当中的id
            Object id = bodyMap.get("id");
            log.info("支付通知的 id ====> {} " , id);
            System.out.println("body = " + body);


            //TODO 验签  保证微信发过来的请求是真实的
            // 将验签的校验器、请求id、请求体 封装成一个对象
            WechatPay2ValidatorForRequest wechatPay2ValidatorForRequest =
                    new WechatPay2ValidatorForRequest(validator,(String)id,body);
            // 验签操作 对微信的请求进行验签操作
            if(!wechatPay2ValidatorForRequest.validate(request)){
                // 验签失败
                log.info("验签失败");
                response.setStatus(500);
                map.put("code","FAIL");
                map.put("message","验签失败");
                return gson.toJson(map);
            }
            log.info("验签成功");
            // 进行验签  密钥解密
            wxPayService.procssOrder(bodyMap);

            //TODO 处理订单
            //response 响应数据微信
            response.setStatus(200);
            map.put("code","SUCCESS");
            map.put("message","OK");
            return gson.toJson(map);
        }catch (Exception e){
            e.printStackTrace();
            response.setStatus(500);
            map.put("code","FAIL");
            map.put("message","失败");
            return gson.toJson(map);
        }
    }
}
